home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Info-Mac 4
/
Info_Mac IV CD-ROM (Pacific HiTech Inc.)(August 1994).iso
/
Development
/
Source
/
Telnet 2.6.1d1 4⁄26⁄94 Folder
/
source
/
config
/
configure.c
next >
Wrap
Text File
|
1994-04-18
|
37KB
|
1,146 lines
/* Configure.c
* New Configuration scheme (the death of config.tel)
*
*****************************************************************
* NCSA Telnet for the Macintosh *
* *
* National Center for Supercomputing Applications *
* Software Development Group *
* 152 Computing Applications Building *
* 605 E. Springfield Ave. *
* Champaign, IL 61820 *
* *
* Copyright (c) 1986-1993, *
* Board of Trustees of the University of Illinois *
*****************************************************************
* Revisions:
* 8/92 Telnet 2.6: Initial version. Jim Browne
*/
#ifdef MPW
#pragma segment Configure
#endif
#include "TelnetHeader.h"
#include <stdio.h>
#include <ctype.h>
#include <Picker.h>
#include "newresrc.h"
#include "DlogUtils.proto.h"
#include "popup.h"
#include "popup.proto.h"
#include "configure.proto.h"
#include "netevent.proto.h" /* For Stask proto */
#include "prefs.proto.h"
#include "bkgr.proto.h" // For StartUpFTP proto
#include "menuseg.proto.h"
#include "macutil.proto.h"
static pascal short TerminalModalProc( DialogPtr dptr, EventRecord *evt, short *item);
PROTO_UPP(TerminalModalProc, ModalFilter);
static pascal short SessionModalProc(DialogPtr dptr, EventRecord *evt, short *item);
PROTO_UPP(SessionModalProc, ModalFilter);
static pascal short MyDlogWListFilter( DialogPtr dptr, EventRecord *evt, short *item);
PROTO_UPP(MyDlogWListFilter, ModalFilter);
static pascal listDitemproc(DialogPtr theDlg, short itemNo);
PROTO_UPP(listDitemproc, UserItem);
extern SysEnvRec theWorld; /* BYU 2.4.18 - System Environment record */
extern FTPServerPrefs* gFTPServerPrefs;
extern ApplicationPrefs* gApplicationPrefs;
static void ZeroNumOnly(void);
static Boolean InNumOnly(short item);
#define NUMONLYSIZE 8
short NumOnly[NUMONLYSIZE]; /* Items for which non-number keys are ignored */
// NumOnly[0] is number of "safe" item to return
void CONFIGUREunload(void) {}
void Cenviron( void)
{
DialogPtr dptr;
short ditem;
Str255 scratchPstring;
long scratchlong;
OSType newtype;
dptr = GetNewMySmallStrangeDialog( PrefDLOG, NULL, kInFront, (void *)ThirdCenterDialog);
SetCntrl(dptr, PrefDClose, gApplicationPrefs->WindowsDontGoAway);
SetCntrl(dptr, PrefStag, gApplicationPrefs->StaggerWindows);
SetCntrl(dptr, PrefCMDkey, gApplicationPrefs->CommandKeys);
SetCntrl(dptr, PrefTMap, gApplicationPrefs->RemapTilde);
SetCntrl(dptr, PrefBlink, gApplicationPrefs->BlinkCursor);
SetCntrl(dptr, PrefBlockCursor, (gApplicationPrefs->CursorType == 0));
SetCntrl(dptr, PrefUnderscoreCursor, (gApplicationPrefs->CursorType == 1));
SetCntrl(dptr, PrefVerticalCursor, (gApplicationPrefs->CursorType == 2));
scratchPstring[0] = 4;
BlockMove(&(gApplicationPrefs->CaptureFileCreator), &scratchPstring[1], sizeof(OSType));
SetTEText(dptr, PrefCaptTE, scratchPstring);
newtype = gApplicationPrefs->CaptureFileCreator;
scratchlong = gApplicationPrefs->CopyTableThresh;
NumToString(scratchlong, scratchPstring);
SetTEText(dptr, PrefCTt, scratchPstring);
SelIText(dptr, PrefCTt, 0, 32767);
NumToString(gApplicationPrefs->TimeSlice, scratchPstring);
SetTEText(dptr, PrefTimeSlice, scratchPstring);
ShowWindow(dptr);
ditem=0; /* initially no hits */
while((ditem>2) || (ditem==0)) {
ModalDialog(DLOGwOK_CancelUPP,&ditem);
switch(ditem) {
case PrefDClose:
case PrefStag:
case PrefCMDkey:
case PrefTMap:
case PrefBlink:
FlipCheckBox( dptr, ditem);
break;
case PrefBlockCursor:
SetCntrl(dptr, PrefBlockCursor, 1);
SetCntrl(dptr, PrefUnderscoreCursor, 0);
SetCntrl(dptr, PrefVerticalCursor, 0);
break;
case PrefUnderscoreCursor:
SetCntrl(dptr, PrefBlockCursor, 0);
SetCntrl(dptr, PrefUnderscoreCursor, 1);
SetCntrl(dptr, PrefVerticalCursor, 0);
break;
case PrefVerticalCursor:
SetCntrl(dptr, PrefBlockCursor, 0);
SetCntrl(dptr, PrefUnderscoreCursor, 0);
SetCntrl(dptr, PrefVerticalCursor, 1);
break;
case PrefCaptCreat:
GetApplicationType(&newtype);
scratchPstring[0] = 4;
BlockMove(&newtype, &scratchPstring[1], sizeof(OSType));
SetTEText(dptr, PrefCaptTE, scratchPstring);
default:
break;
} /* switch */
}
if (ditem==DLOGCancel) {
DisposDialog( dptr);
return;
}
GetTEText(dptr, PrefCTt, scratchPstring);
StringToNum(scratchPstring, &scratchlong);
gApplicationPrefs->CopyTableThresh = (short) scratchlong;
GetTEText(dptr, PrefTimeSlice, scratchPstring);
StringToNum(scratchPstring, &scratchlong);
BoundsCheck(&scratchlong, 100, 2);
gApplicationPrefs->TimeSlice = scratchlong;
GetTEText(dptr, PrefCaptTE, scratchPstring);
BlockMove(&scratchPstring[1], &(gApplicationPrefs->CaptureFileCreator), sizeof(OSType));
gApplicationPrefs->CommandKeys = GetCntlVal(dptr, PrefCMDkey);
gApplicationPrefs->WindowsDontGoAway = GetCntlVal(dptr, PrefDClose);
gApplicationPrefs->RemapTilde = GetCntlVal(dptr, PrefTMap);
gApplicationPrefs->StaggerWindows = GetCntlVal(dptr, PrefStag);
gApplicationPrefs->BlinkCursor = GetCntlVal(dptr, PrefBlink);
gApplicationPrefs->CursorType = (GetCntlVal(dptr, PrefUnderscoreCursor) == 1) + (2 *
(GetCntlVal(dptr, PrefVerticalCursor) == 1));
switchMenus(gApplicationPrefs->CommandKeys);
SavePreferences();
DisposDialog( dptr);
}
void Cftp(void)
{
DialogPtr dptr;
short ditem;
Str255 scratchPstring;
OSType scratchOSType;
SFReply sfr;
FInfo fi;
Point where = {100,100};
dptr = GetNewMySmallStrangeDialog( FTPDLOG, NULL, kInFront, (void *)ThirdCenterDialog);
SetCntrl(dptr, FTPServerOff, (gFTPServerPrefs->ServerState == 0));
SetCntrl(dptr, FTPServerUnsecure, (gFTPServerPrefs->ServerState == 1));
SetCntrl(dptr, FTPServerPswdPlease, (gFTPServerPrefs->ServerState == 2));
SetCntrl(dptr, FTPShowFTPlog, gFTPServerPrefs->ShowFTPlog);
SetCntrl(dptr, FTPrevDNS, gFTPServerPrefs->DNSlookupconnections);
SetCntrl(dptr, FTPUseMacBinaryII, gFTPServerPrefs->UseMacBinaryII);
SetCntrl(dptr, FTPResetMacBinary, gFTPServerPrefs->ResetMacBinary);
SetCntrl(dptr, FTPISO, gFTPServerPrefs->DoISOtranslation);
HideDItem(dptr, FTPrevDNS); // Sometime later, perhaps.
scratchPstring[0] = 4;
BlockMove(&(gFTPServerPrefs->BinaryCreator), &scratchPstring[1], sizeof(OSType));
SetTEText(dptr, FTPbincreatTE, scratchPstring);
BlockMove(&(gFTPServerPrefs->BinaryType), &scratchPstring[1], sizeof(OSType));
SetTEText(dptr, FTPbintypeTE, scratchPstring);
SelIText(dptr, FTPbintypeTE, 0, 32767);
BlockMove(&(gFTPServerPrefs->TextCreator), &scratchPstring[1], sizeof(OSType));
SetTEText(dptr, FTPtextcreatTE, scratchPstring);
ShowWindow(dptr);
ditem=0; /* initially no hits */
while((ditem>2) || (ditem==0)) {
ModalDialog(DLOGwOK_CancelUPP,&ditem);
switch(ditem) {
case FTPShowFTPlog:
case FTPrevDNS:
case FTPUseMacBinaryII:
case FTPResetMacBinary:
case FTPISO:
FlipCheckBox( dptr, ditem);
break;
case FTPServerOff:
SetCntrl(dptr, FTPServerOff, 1);
SetCntrl(dptr, FTPServerUnsecure, 0);
SetCntrl(dptr, FTPServerPswdPlease, 0);
break;
case FTPServerUnsecure:
SetCntrl(dptr, FTPServerOff, 0);
SetCntrl(dptr, FTPServerUnsecure, 1);
SetCntrl(dptr, FTPServerPswdPlease, 0);
break;
case FTPServerPswdPlease:
SetCntrl(dptr, FTPServerOff, 0);
SetCntrl(dptr, FTPServerUnsecure, 0);
SetCntrl(dptr, FTPServerPswdPlease, 1);
break;
case FTPtextcreatorbutton:
if (GetApplicationType(&scratchOSType)) {
BlockMove(&scratchOSType, &scratchPstring[1], sizeof(OSType));
SetTEText(dptr, FTPtextcreatTE, scratchPstring);
}
break;
case FTPbinexamplebutton:
SFGetFile(where, NULL, NULL, -1, NULL, NULL, &sfr);
if (sfr.good) {
GetFInfo(sfr.fName, sfr.vRefNum, &fi);
scratchPstring[0] = sizeof(OSType);
BlockMove(&fi.fdCreator, &scratchPstring[1], sizeof(OSType));
SetTEText(dptr, FTPbincreatTE, scratchPstring);
BlockMove(&fi.fdType, &scratchPstring[1], sizeof(OSType));
SetTEText(dptr, FTPbintypeTE, scratchPstring);
}
break;
default:
break;
} /* switch */
} /* while */
if (ditem==DLOGCancel) {
DisposDialog( dptr);
return;
}
gFTPServerPrefs->ServerState = GetCntlVal(dptr, FTPServerUnsecure) +
GetCntlVal(dptr, FTPServerPswdPlease) * 2;
StartUpFTP(); // Make sure FTP server recognizes new mode.
gFTPServerPrefs->ShowFTPlog = GetCntlVal(dptr, FTPShowFTPlog);
gFTPServerPrefs->DNSlookupconnections = GetCntlVal(dptr, FTPrevDNS);
gFTPServerPrefs->UseMacBinaryII = GetCntlVal(dptr, FTPUseMacBinaryII);
gFTPServerPrefs->ResetMacBinary = GetCntlVal(dptr, FTPResetMacBinary);
gFTPServerPrefs->DoISOtranslation = GetCntlVal(dptr, FTPISO);
GetTEText(dptr, FTPbincreatTE, scratchPstring);
BlockMove(&scratchPstring[1], &(gFTPServerPrefs->BinaryCreator), sizeof(OSType));
GetTEText(dptr, FTPbintypeTE, scratchPstring);
BlockMove(&scratchPstring[1], &(gFTPServerPrefs->BinaryType), sizeof(OSType));
GetTEText(dptr, FTPtextcreatTE, scratchPstring);
BlockMove(&scratchPstring[1], &(gFTPServerPrefs->TextCreator), sizeof(OSType));
SavePreferences();
DisposDialog( dptr);
}
Boolean GetApplicationType(OSType *type)
{
SFTypeList types;
SFReply sfr;
FInfo fi;
Point where;
SetPt(&where, 100, 100);
types[0] = 'APPL';
SFGetFile(where, NULL, NULL, 1, types, NULL, &sfr);
if (sfr.good) {
GetFInfo(sfr.fName, sfr.vRefNum, &fi);
BlockMove(&fi.fdCreator, type, sizeof(OSType)); // Copy the application creator type
}
return(sfr.good);
}
// Our standard modal dialog filter with code for handling user items containing lists.
SIMPLE_UPP(MyDlogWListFilter, ModalFilter);
pascal short MyDlogWListFilter( DialogPtr dptr, EventRecord *evt, short *item)
{
short keyCode, key, iType;
Handle iHndl;
Rect iRect;
Point scratchPoint;
SetPort(dptr);
if (evt->what == keyDown) {
key = evt->message & charCodeMask;
keyCode = (evt->message >>8) & 0xff ;
if ((key == 0x0d) || (key == 0x03)) { // 0x0d == return, 0x03 == enter
*item = 1; // ok
FlashButton(dptr, 1);
return(-1);
}
}
else if (evt->what == updateEvt) {
if ((WindowPtr)evt->message == dptr) {
GetDItem(dptr,1,&iType,&iHndl,&iRect); // ok
PenSize(3,3);
InsetRect(&iRect,-4,-4);
FrameRoundRect(&iRect,16,16);
}
}
if (evt->what == mouseDown) {
GetDItem(dptr, kItemList, &iType, &iHndl, &iRect);
scratchPoint = evt->where;
GlobalToLocal(&scratchPoint);
if (PtInRect(scratchPoint, &iRect)) {
*item = kItemList;
if (LClick(scratchPoint, evt->modifiers, (ListHandle)GetWRefCon(dptr))) {
*item = kChange;
FlashButton(dptr, kChange);
}
return(-1);
}
}
return(FALSE);
}
// User Dialog Item Procedure for a list. Assumes the Dialog's refcon contains the list
// handle.
SIMPLE_UPP(listDitemproc, UserItem);
pascal listDitemproc(DialogPtr theDlg, short itemNo)
{
short itemType;
Handle ControlHndl;
Rect scratchRect;
GetDItem(theDlg, itemNo, &itemType, &ControlHndl, &scratchRect);
PenNormal();
InsetRect(&scratchRect, -1, -1);
FrameRect(&scratchRect);
LUpdate(theDlg->visRgn, (ListHandle)GetWRefCon(theDlg));
}
void BoundsCheck(long *value, long high, long low)
{
if (*value > high) *value = high;
if (*value < low) *value = low;
}
void EditConfigType(ResType ConfigResourceType, Boolean (*EditFunction)(StringPtr))
{
DialogPtr dptr;
Handle iHndl;
short iType, length, ditem, numberofitems, index, resID;
Rect ListBox, ListBounds;
Point cellSize, theCell;
ListHandle thelist;
Handle ItemResource;
Str255 ItemName;
ResType restype;
dptr = GetNewMySmallDialog(kItemDLOG, NULL, kInFront, (void *)ThirdCenterDialog);
ditem = 3;
GetDItem(dptr, kItemList, &iType, &iHndl, &ListBox);
SetDItem(dptr, kItemList, iType, (Handle)listDitemprocUPP, &ListBox);
ListBox.right -= 15; // Make room for scrollbar
SetRect(&ListBounds, 0,0,1,0);
SetPt(&cellSize,(ListBox.right-ListBox.left),16);
thelist = LNew(&ListBox, &ListBounds, cellSize, 0, (WindowPtr)dptr,0,0,0,1);
#define kSCListMods lNoNilHilite+lOnlyOne
(*(thelist))->listFlags = kSCListMods;
SetWRefCon(dptr, (long)thelist); // So the Ditem proc can find the list
UseResFile(TelInfo->SettingsFile);
numberofitems = Count1Resources(ConfigResourceType);
for(index = 1, theCell.v = 0, theCell.h = 0; index <= numberofitems;
index++, theCell.v++) {
ItemResource = Get1IndResource(ConfigResourceType, index);
GetResInfo(ItemResource, &resID, &restype, (StringPtr)&ItemName);
LAddRow(1,-1, thelist);
LSetCell(ItemName+1, Length(ItemName), theCell, thelist);
ReleaseResource(ItemResource);
}
theCell.v = 0;
theCell.h = 0;
if (numberofitems) LSetSelect(1, theCell, thelist);
LDoDraw(1, thelist);
// LUpdate(dptr->visRgn, thelist); Is this needed?
while (ditem > 1) {
ModalDialog(MyDlogWListFilterUPP, &ditem);
switch(ditem) {
case kRemove:
SetPt(&theCell, 0, 0);
if (LGetSelect(TRUE, &theCell, thelist)) {
length = 254;
LGetCell(ItemName+1, &length, theCell, thelist);
ItemName[0] = (char)length;
if (!(EqualString(ItemName, "\p<Default>", TRUE, FALSE))) {
LDelRow(1,theCell.v,thelist);
UseResFile(TelInfo->SettingsFile);
ItemResource = Get1NamedResource(ConfigResourceType, ItemName);
RmveResource(ItemResource);
ReleaseResource(ItemResource);
UpdateResFile(TelInfo->SettingsFile);
}
}
break;
case kChange:
SetPt(&theCell, 0, 0);
if (LGetSelect(TRUE, &theCell, thelist)) {
length = 254;
LGetCell(ItemName+1, &length, theCell, thelist);
ItemName[0] = (char)length;
if ((*EditFunction)((StringPtr)&ItemName)) {
LSetCell(ItemName+1, Length(ItemName), theCell, thelist);
}
}
break;
case kNew:
ItemName[0] = 0; // Signal new shortcut
if ((*EditFunction)((StringPtr)&ItemName)) {
theCell.v = LAddRow(1, -1, thelist);
LSetCell(ItemName+1, Length(ItemName), theCell, thelist);
}
break;
} // switch
SetPt(&theCell, 0, 0);
if (LGetSelect(TRUE, &theCell, thelist)) {
Hilite(dptr, kRemove, 0);
Hilite(dptr, kChange, 0);
}
else {
Hilite(dptr, kRemove, 255);
Hilite(dptr, kChange, 255);
}
} // while
LDispose(thelist);
DisposDialog(dptr);
}
void ZeroNumOnly(void)
{
short i;
for(i=0; i<NUMONLYSIZE; i++) NumOnly[i]=0;
}
Boolean InNumOnly(short item)
{
short index = 1;
while ((NumOnly[index] != item) && (NumOnly[index] != 0)) index++;
return(NumOnly[index] == item);
}
short NumberOfColorBoxes;
short BoxColorItems[8];
RGBColor BoxColorData[8];
SIMPLE_UPP(ColorBoxItemProc, UserItem);
pascal ColorBoxItemProc(DialogPtr theDlg, short itemNo)
{
short itemType, index = 0;
Handle ControlHndl;
Rect scratchRect;
RGBColor rgb;
GetDItem(theDlg, itemNo, &itemType, &ControlHndl, &scratchRect);
PenNormal();
FrameRect(&scratchRect);
InsetRect(&scratchRect, 1, 1); // Why isn't this framing the boxes?
GetForeColor(&rgb);
while ((index < NumberOfColorBoxes) && (BoxColorItems[index] != itemNo)) index++;
RGBForeColor(&BoxColorData[index]); /* color corresponding to item */
PaintRect(&scratchRect);
RGBForeColor(&rgb); /* restore previous foreground color */
}
SIMPLE_UPP(ColorBoxModalProc, ModalFilter);
pascal short ColorBoxModalProc( DialogPtr dptr, EventRecord *evt, short *item)
{
short keyCode, key, iType, index;
Handle iHndl;
Rect iRect;
if ((evt->what == keyDown) || (evt->what == autoKey)) {
key = evt->message & charCodeMask;
keyCode = (evt->message >>8) & 0xff;
if ((key == 0x0d) || (key == 0x03)) { // 0x0d == return, 0x03 == enter
*item = DLOGOk;
return(-1); /* BYU LSC - pascal doesn't like "1" as true */
}
if (((key == '.') && (evt->modifiers & cmdKey)) ||
((key == 0x1b) && (keyCode == 0x35)) ) { // 0x35 == escKey
*item = DLOGCancel;
return(-1); /* BYU LSC - pascal doesn't like "1" as true */
}
if ((key < '0' || key > '9') &&
!(key == 0x08 || key == 0x09 || (key > 0x1B && key < 0x20))
&& InNumOnly(((DialogPeek)dptr)->editField + 1)) {
/* Reject non-numbers for this TE */
*item = NumOnly[0]; /* Kludge -- Return "safe" item */
return(-1);
}
}
if (evt->what == updateEvt) {
if ((WindowPtr)evt->message == dptr) {
GetDItem(dptr,DLOGOk,&iType,&iHndl,&iRect); // ok
PenSize(3,3);
InsetRect(&iRect,-4,-4);
FrameRoundRect(&iRect,16,16);
for (index = 0; index < NumberOfColorBoxes; index++)
ColorBoxItemProc(dptr, BoxColorItems[index]); // update color boxes
}
}
Stask();
return(FALSE);
}
SIMPLE_UPP(TerminalModalProc, ModalFilter);
pascal short TerminalModalProc( DialogPtr dptr, EventRecord *evt, short *item)
{
if (evt->what == mouseDown) return(PopupMousedown(dptr, evt, item));
return(ColorBoxModalProc(dptr, evt, item));
}
SIMPLE_UPP(SessionModalProc, ModalFilter);
pascal short SessionModalProc(DialogPtr dptr, EventRecord *evt, short *item)
{
if ((evt->what == keyDown) || (evt->what == autoKey))
if ((evt->message & charCodeMask) == ' ') {
*item = NumOnly[0]; /* Kludge -- Return "safe" item */
return(-1);
}
return(TerminalModalProc(dptr, evt, item));
}
Boolean EditTerminal(StringPtr PrefRecordNamePtr)
{
DialogPtr dptr;
short ditem, scratchshort, resourceID;
long scratchlong;
ResType scratchResType;
Boolean IsNewPrefRecord, UserLikesNewColor;
TerminalPrefs** TermPrefsHdl;
TerminalPrefs* TermPrefsPtr;
Str255 scratchPstring;
RGBColor scratchRGBcolor;
Point ColorBoxPoint;
MenuHandle WeNeedAFontMenuHandle;
popup TPopup[] = {{TermFontPopup, (MenuHandle) 0, 1},
{0, (MenuHandle) 0, 0}};
dptr = GetNewMySmallStrangeDialog(TermDLOG, NULL, kInFront, (void *)ThirdCenterDialog);
ditem = 3;
WeNeedAFontMenuHandle = NewMenu(666, "\p");
AddResMenu(WeNeedAFontMenuHandle, 'FONT');
TPopup[0].h = WeNeedAFontMenuHandle;
PopupInit(dptr, TPopup);
if (PrefRecordNamePtr[0] != 0) {
IsNewPrefRecord = FALSE;
UseResFile(TelInfo->SettingsFile);
TermPrefsHdl = (TerminalPrefs **)Get1NamedResource(TERMINALPREFS_RESTYPE, PrefRecordNamePtr);
if (EqualString(PrefRecordNamePtr, "\p<Default>", FALSE, FALSE)) {
HideDItem(dptr, TermNameStatText);
HideDItem(dptr, TermName);
}
}
else {
TermPrefsHdl = GetDefaultTerminal();
IsNewPrefRecord = TRUE;
GetIndString(PrefRecordNamePtr, MISC_STRINGS, MISC_NEWTERM);
}
HLock((Handle) TermPrefsHdl);
TermPrefsPtr = *TermPrefsHdl;
SetTEText(dptr, TermName, PrefRecordNamePtr);
SetCntrl(dptr, TermANSI, TermPrefsPtr->ANSIgraphics);
HideDItem(dptr, TermANSI); // Perhaps later
SetCntrl(dptr, TermXterm, TermPrefsPtr->Xtermsequences);
SetCntrl(dptr, Termvtwrap, TermPrefsPtr->vtwrap);
SetCntrl(dptr, Termmeta, TermPrefsPtr->emacsmetakey);
SetCntrl(dptr, Termarrow, TermPrefsPtr->emacsarrows);
SetCntrl(dptr, TermMAT, TermPrefsPtr->MATmappings);
SetCntrl(dptr, Termeightbit, TermPrefsPtr->eightbit);
SetCntrl(dptr, Termclearsave, TermPrefsPtr->clearsave);
SetCntrl(dptr, TermVT100, (TermPrefsPtr->vtemulation == 0));
SetCntrl(dptr, TermVT220, (TermPrefsPtr->vtemulation == 1));
scratchlong = (long)(TermPrefsPtr->vtwidth);
NumToString(scratchlong, scratchPstring);
SetTEText(dptr, TermWidth, scratchPstring);
scratchlong = (short)(TermPrefsPtr->vtheight);
NumToString(scratchlong, scratchPstring);
SetTEText(dptr, TermHeight, scratchPstring);
scratchlong = TermPrefsPtr->fontsize;
NumToString(scratchlong, scratchPstring);
SetTEText(dptr, TermFontSize, scratchPstring);
scratchlong = TermPrefsPtr->numbkscroll;
NumToString(scratchlong, scratchPstring);
SetTEText(dptr, TermScrollback, scratchPstring);
SetTEText(dptr, TermAnswerback, TermPrefsPtr->AnswerBackMessage);
for(scratchshort = CountMItems(TPopup[0].h); scratchshort; scratchshort--) {
GetItem(TPopup[0].h, scratchshort, scratchPstring);
if (EqualString(scratchPstring, (TermPrefsPtr->DisplayFont), TRUE, FALSE))
TPopup[0].choice = scratchshort;
}
ZeroNumOnly();
NumOnly[0] = TermSafeItem;
NumOnly[1] = TermWidth; NumOnly[2] = TermHeight; NumOnly[3] = TermFontSize;
NumOnly[4] = TermScrollback; NumOnly[5] = 0;
if (theWorld.hasColorQD) {
for (scratchshort = 0, NumberOfColorBoxes = 4; scratchshort < NumberOfColorBoxes; scratchshort++) {
BoxColorItems[scratchshort] = TermNFcolor + scratchshort;
BlockMove(&(TermPrefsPtr->nfcolor) + scratchshort,
&BoxColorData[scratchshort], sizeof(RGBColor));
UItemAssign( dptr, TermNFcolor + scratchshort, ColorBoxItemProcUPP);
}
}
else
NumberOfColorBoxes = 0; // B&W machine
ColorBoxPoint.h = 0; // Have the color picker center the box on the main
ColorBoxPoint.v = 0; // screen
SelIText(dptr, TermName, 0, 32767);
ShowWindow(dptr);
while (ditem > 2) {
ModalDialog(TerminalModalProcUPP, &ditem);
switch (ditem) {
case TermANSI:
case TermXterm:
case Termvtwrap:
case Termmeta:
case Termarrow:
case TermMAT:
case Termeightbit:
case Termclearsave:
FlipCheckBox(dptr, ditem);
break;
case TermVT100:
case TermVT220:
FlipRadioButton(dptr, TermVT100);
FlipRadioButton(dptr, TermVT220);
if (ditem == TermVT100)
SetTEText(dptr, TermAnswerback, "\pVT100");
else
SetTEText(dptr, TermAnswerback, "\pVT220");
break;
case TermNFcolor:
case TermNBcolor:
case TermBFcolor:
case TermBBcolor:
if (theWorld.hasColorQD) {
UserLikesNewColor = GetColor(ColorBoxPoint, "\pPlease Select New Color",
&BoxColorData[ditem-TermNFcolor], &scratchRGBcolor);
if (UserLikesNewColor)
BoxColorData[ditem-TermNFcolor] = scratchRGBcolor;
}
break;
default:
break;
} // switch
} // while
GetItem(TPopup[0].h, TPopup[0].choice, scratchPstring);
PopupCleanup();
if (ditem == 2) {
if (IsNewPrefRecord) DisposeHandle((Handle) TermPrefsHdl);
else ReleaseResource((Handle) TermPrefsHdl);
DisposeDialog(dptr);
return(FALSE); // No changes should be made.
}
if (theWorld.hasColorQD) {
for (scratchshort = 0; scratchshort < NumberOfColorBoxes; scratchshort++) {
BlockMove(&BoxColorData[scratchshort],
&(TermPrefsPtr->nfcolor) + scratchshort, sizeof(RGBColor));
}
}
if (Length(scratchPstring) > 63) scratchPstring[0] = 63;
BlockMove(scratchPstring, (TermPrefsPtr->DisplayFont), scratchPstring[0]+1);
TermPrefsPtr->ANSIgraphics = GetCntlVal(dptr, TermANSI);
TermPrefsPtr->Xtermsequences = GetCntlVal(dptr, TermXterm);
TermPrefsPtr->vtwrap = GetCntlVal(dptr, Termvtwrap);
TermPrefsPtr->emacsmetakey = GetCntlVal(dptr, Termmeta);
TermPrefsPtr->emacsarrows = GetCntlVal(dptr, Termarrow);
TermPrefsPtr->MATmappings = GetCntlVal(dptr, TermMAT);
TermPrefsPtr->eightbit = GetCntlVal(dptr, Termeightbit);
TermPrefsPtr->clearsave = GetCntlVal(dptr, Termclearsave);
TermPrefsPtr->vtemulation = (GetCntlVal(dptr, TermVT220) != 0);
GetTEText(dptr, TermWidth, scratchPstring);
StringToNum(scratchPstring, &scratchlong);
BoundsCheck(&scratchlong, 133, 10);
TermPrefsPtr->vtwidth = (short) scratchlong;
GetTEText(dptr, TermHeight, scratchPstring);
StringToNum(scratchPstring, &scratchlong);
BoundsCheck(&scratchlong, 80, 10);
TermPrefsPtr->vtheight = (short) scratchlong;
GetTEText(dptr, TermFontSize, scratchPstring);
StringToNum(scratchPstring, &scratchlong);
BoundsCheck(&scratchlong, 24, 4);
TermPrefsPtr->fontsize = (short) scratchlong;
GetTEText(dptr, TermScrollback, scratchPstring);
StringToNum(scratchPstring, &scratchlong);
BoundsCheck(&scratchlong, 50000, 24);
TermPrefsPtr->numbkscroll = (short) scratchlong;
GetTEText(dptr, TermAnswerback, scratchPstring);
if (Length(scratchPstring) > 63) scratchPstring[0] = 63;
BlockMove(scratchPstring, TermPrefsPtr->AnswerBackMessage, scratchPstring[0]+1);
GetTEText(dptr, TermName, PrefRecordNamePtr);
if (IsNewPrefRecord) {
UseResFile(TelInfo->SettingsFile);
resourceID = UniqueID(TERMINALPREFS_RESTYPE);
AddResource((Handle)TermPrefsHdl, TERMINALPREFS_RESTYPE, resourceID, PrefRecordNamePtr);
UpdateResFile(TelInfo->SettingsFile);
ReleaseResource((Handle)TermPrefsHdl);
}
else {
UseResFile(TelInfo->SettingsFile);
GetResInfo((Handle)TermPrefsHdl, &resourceID, &scratchResType,(StringPtr) &scratchPstring);
SetResInfo((Handle)TermPrefsHdl, resourceID, PrefRecordNamePtr);
ChangedResource((Handle)TermPrefsHdl);
UpdateResFile(TelInfo->SettingsFile);
ReleaseResource((Handle)TermPrefsHdl);
}
DisposeDialog(dptr);
return(TRUE); // A resource has changed or been added.
}
Boolean EditSession(StringPtr PrefRecordNamePtr)
{
DialogPtr dptr;
short ditem, scratchshort, resourceID;
long scratchlong;
ResType scratchResType;
Boolean IsNewPrefRecord;
SessionPrefs** SessPrefsHdl;
SessionPrefs* SessPrefsPtr;
Str255 scratchPstring, scratchPstring2;
popup SPopup[] = {{SessTermPopup, (MenuHandle) 0, 1},
{SessTransTablePopup, (MenuHandle) 0, 1},
{0, (MenuHandle) 0, 0}};
dptr = GetNewMySmallStrangeDialog(SessionConfigDLOG, NULL, kInFront, (void *)ThirdCenterDialog);
ditem = 3;
SPopup[0].h = NewMenu(666, "\p");
UseResFile(TelInfo->SettingsFile);
AddResMenu(SPopup[0].h, TERMINALPREFS_RESTYPE);
EnableItem(SPopup[0].h, 0); // Make sure the entire menu is enabled
SPopup[1].h = NewMenu(667, "\p");
AppendMenu(SPopup[1].h, "\pNone");
AddResMenu(SPopup[1].h, USER_TRSL);
EnableItem(SPopup[1].h, 0); // Make sure the entire menu is enabled
PopupInit(dptr, SPopup);
if (PrefRecordNamePtr[0] != 0) {
IsNewPrefRecord = FALSE;
UseResFile(TelInfo->SettingsFile);
SessPrefsHdl = (SessionPrefs **)Get1NamedResource(SESSIONPREFS_RESTYPE, PrefRecordNamePtr);
if (EqualString(PrefRecordNamePtr, "\p<Default>", FALSE, FALSE)) {
HideDItem(dptr, SessAlias);
HideDItem(dptr, SessAliasStatText);
}
}
else {
SessPrefsHdl = GetDefaultSession();
IsNewPrefRecord = TRUE;
GetIndString(PrefRecordNamePtr, MISC_STRINGS, MISC_NEWSESSION);
}
HLock((Handle) SessPrefsHdl);
SessPrefsPtr = *SessPrefsHdl;
SetCntrl(dptr, SessTEKinhib, (SessPrefsPtr->tektype == -1));
SetCntrl(dptr, SessTEK4014, (SessPrefsPtr->tektype == 0));
SetCntrl(dptr, SessTEK4105, (SessPrefsPtr->tektype == 1));
SetCntrl(dptr, SessPasteQuick, (SessPrefsPtr->pastemethod == 0));
SetCntrl(dptr, SessPasteBlock, (SessPrefsPtr->pastemethod == 1));
SetCntrl(dptr, SessDeleteDel, (SessPrefsPtr->bksp == 1));
SetCntrl(dptr, SessDeleteBS, (SessPrefsPtr->bksp == 0));
SetCntrl(dptr, SessForceSave, SessPrefsPtr->forcesave);
SetCntrl(dptr, SessBezerkeley, SessPrefsPtr->crmap);
SetCntrl(dptr, SessLinemode, SessPrefsPtr->linemode);
SetCntrl(dptr, SessTEKclear, SessPrefsPtr->tekclear);
SetCntrl(dptr, SessHalfDuplex, SessPrefsPtr->halfdup);
SetCntrl(dptr, SessLowLevelErrs, SessPrefsPtr->showlowlevelerrors);
SetCntrl(dptr, SessAuthenticate, SessPrefsPtr->authenticate);
SetCntrl(dptr, SessEncrypt, SessPrefsPtr->encrypt);
SetCntrl(dptr, SessLocalEcho, SessPrefsPtr->localecho);
SetTEText(dptr, SessHostName, SessPrefsPtr->hostname);
SetTEText(dptr, SessAlias, PrefRecordNamePtr);
NumToString(SessPrefsPtr->port, scratchPstring);
SetTEText(dptr, SessPort, scratchPstring);
NumToString(SessPrefsPtr->pasteblocksize, scratchPstring);
SetTEText(dptr, SessBlockSize, scratchPstring);
scratchPstring[0] = 2;
scratchPstring[1] = '^';
if (SessPrefsPtr->ckey != -1) {
scratchPstring[2] = SessPrefsPtr->ckey ^ 64;
SetTEText(dptr, SessInterrupt, scratchPstring);
}
if (SessPrefsPtr->skey != -1) {
scratchPstring[2] = SessPrefsPtr->skey ^ 64;
SetTEText(dptr, SessSuspend, scratchPstring);
}
if (SessPrefsPtr->qkey != -1) {
scratchPstring[2] = SessPrefsPtr->qkey ^ 64;
SetTEText(dptr, SessResume, scratchPstring);
}
for(scratchshort = CountMItems(SPopup[0].h); scratchshort; scratchshort--) {
GetItem(SPopup[0].h, scratchshort, scratchPstring);
if (EqualString(scratchPstring, (SessPrefsPtr->TerminalEmulation), TRUE, FALSE))
SPopup[0].choice = scratchshort;
}
for(scratchshort = CountMItems(SPopup[1].h); scratchshort; scratchshort--) {
GetItem(SPopup[1].h, scratchshort, scratchPstring);
if (EqualString(scratchPstring, (SessPrefsPtr->TranslationTable), TRUE, FALSE))
SPopup[1].choice = scratchshort;
}
NumberOfColorBoxes = 0;
ZeroNumOnly();
NumOnly[0] = SessSafeItem;
NumOnly[1] = SessPort; NumOnly[2] = SessBlockSize;
SelIText(dptr, SessAlias, 0, 32767);
ShowWindow(dptr);
while (ditem > 2) {
ModalDialog(SessionModalProcUPP, &ditem);
switch (ditem) {
case SessForceSave:
case SessBezerkeley:
case SessLinemode:
case SessTEKclear:
case SessHalfDuplex:
case SessLowLevelErrs:
case SessAuthenticate:
case SessEncrypt:
case SessLocalEcho:
FlipCheckBox(dptr, ditem);
break;
case SessTEKinhib:
SetCntrl(dptr, SessTEKinhib, 1);
SetCntrl(dptr, SessTEK4014, 0);
SetCntrl(dptr, SessTEK4105, 0);
break;
case SessTEK4014:
SetCntrl(dptr, SessTEKinhib, 0);
SetCntrl(dptr, SessTEK4014, 1);
SetCntrl(dptr, SessTEK4105, 0);
break;
case SessTEK4105:
SetCntrl(dptr, SessTEKinhib, 0);
SetCntrl(dptr, SessTEK4014, 0);
SetCntrl(dptr, SessTEK4105, 1);
break;
case SessPasteQuick:
case SessPasteBlock:
FlipRadioButton(dptr, SessPasteQuick);
FlipRadioButton(dptr, SessPasteBlock);
break;
case SessDeleteDel:
case SessDeleteBS:
FlipRadioButton(dptr, SessDeleteDel);
FlipRadioButton(dptr, SessDeleteBS);
break;
case SessInterrupt:
case SessSuspend:
case SessResume:
GetTEText(dptr, ditem, scratchPstring);
if ((scratchPstring[1] < 32) && (scratchPstring[1] > 0)) {
scratchPstring[0] = 2;
scratchPstring[2] = scratchPstring[1] ^ 64;
scratchPstring[1] = '^';
SetTEText(dptr, ditem, scratchPstring);
}
break;
default:
break;
} // switch
} // while
GetItem(SPopup[0].h, SPopup[0].choice, scratchPstring);
GetItem(SPopup[1].h, SPopup[1].choice, scratchPstring2);
PopupCleanup();
if (ditem == 2) {
if (IsNewPrefRecord) DisposeHandle((Handle) SessPrefsHdl);
else ReleaseResource((Handle) SessPrefsHdl);
DisposeDialog(dptr);
return(FALSE); // No changes should be made.
}
if (Length(scratchPstring) > 63) scratchPstring[0] = 63;
BlockMove(scratchPstring, (SessPrefsPtr->TerminalEmulation), scratchPstring[0]+1);
if (Length(scratchPstring2) > 63) scratchPstring[0] = 63;
BlockMove(scratchPstring2, (SessPrefsPtr->TranslationTable), scratchPstring2[0]+1);
SessPrefsPtr->tektype = (-1 * GetCntlVal(dptr, SessTEKinhib)) + GetCntlVal(dptr, SessTEK4105);
SessPrefsPtr->pastemethod = !GetCntlVal(dptr, SessPasteQuick);
SessPrefsPtr->bksp = GetCntlVal(dptr, SessDeleteDel);
SessPrefsPtr->forcesave = GetCntlVal(dptr, SessForceSave);
SessPrefsPtr->crmap = GetCntlVal(dptr, SessBezerkeley);
SessPrefsPtr->linemode = GetCntlVal(dptr, SessLinemode);
SessPrefsPtr->tekclear = GetCntlVal(dptr, SessTEKclear);
SessPrefsPtr->halfdup = GetCntlVal(dptr, SessHalfDuplex);
SessPrefsPtr->showlowlevelerrors = GetCntlVal(dptr, SessLowLevelErrs);
SessPrefsPtr->authenticate = GetCntlVal(dptr, SessAuthenticate);
SessPrefsPtr->encrypt = GetCntlVal(dptr, SessEncrypt);
SessPrefsPtr->localecho = GetCntlVal(dptr, SessLocalEcho);
GetTEText(dptr, SessPort, scratchPstring);
StringToNum(scratchPstring, &scratchlong);
BoundsCheck(&scratchlong, 65530, 1);
SessPrefsPtr->port = (short) scratchlong;
GetTEText(dptr, SessBlockSize, scratchPstring);
StringToNum(scratchPstring, &scratchlong);
BoundsCheck(&scratchlong, 4097, 100);
SessPrefsPtr->pasteblocksize = (short) scratchlong;
GetTEText(dptr, SessHostName, scratchPstring);
if (Length(scratchPstring) > 63) scratchPstring[0] = 63;
BlockMove(scratchPstring, SessPrefsPtr->hostname, scratchPstring[0]+1);
GetTEText(dptr, SessHostName, scratchPstring);
if (Length(scratchPstring) > 63) scratchPstring[0] = 63;
BlockMove(scratchPstring, SessPrefsPtr->hostname, scratchPstring[0]+1);
GetTEText(dptr, SessAlias, PrefRecordNamePtr);
GetTEText(dptr, SessInterrupt, scratchPstring);
if (scratchPstring[0]) SessPrefsPtr->ckey = toupper(scratchPstring[2]) ^ 64;
else SessPrefsPtr->ckey = -1;
GetTEText(dptr, SessSuspend, scratchPstring);
if (scratchPstring[0]) SessPrefsPtr->skey = toupper(scratchPstring[2]) ^ 64;
else SessPrefsPtr->skey = -1;
GetTEText(dptr, SessResume, scratchPstring);
if (scratchPstring[0]) SessPrefsPtr->qkey = toupper(scratchPstring[2]) ^ 64;
else SessPrefsPtr->qkey = -1;
if (IsNewPrefRecord) {
UseResFile(TelInfo->SettingsFile);
resourceID = UniqueID(SESSIONPREFS_RESTYPE);
AddResource((Handle)SessPrefsHdl, SESSIONPREFS_RESTYPE, resourceID, PrefRecordNamePtr);
UpdateResFile(TelInfo->SettingsFile);
ReleaseResource((Handle)SessPrefsHdl);
}
else {
UseResFile(TelInfo->SettingsFile);
GetResInfo((Handle)SessPrefsHdl, &resourceID, &scratchResType,(StringPtr) &scratchPstring);
SetResInfo((Handle)SessPrefsHdl, resourceID, PrefRecordNamePtr);
ChangedResource((Handle)SessPrefsHdl);
UpdateResFile(TelInfo->SettingsFile);
ReleaseResource((Handle)SessPrefsHdl);
}
DisposeDialog(dptr);
return(TRUE); // A resource has changed or been added.
}
Boolean EditFTPUser(StringPtr PrefRecordNamePtr)
{
DialogPtr dptr;
short ditem, scratchshort, resourceID, vRefNum;
ResType scratchResType;
Boolean IsNewPrefRecord;
FTPUser** FTPUHdl;
FTPUser* FTPUptr;
Str255 scratchPstring, scratchPstring2;
dptr = GetNewMySmallStrangeDialog(FTPUserDLOG, NULL, kInFront, (void *)ThirdCenterDialog);
ditem = 3;
HideDItem(dptr, FTPUcanchangeCWD); // Sometime later, perhaps
if (PrefRecordNamePtr[0] != 0) {
IsNewPrefRecord = FALSE;
UseResFile(TelInfo->SettingsFile);
FTPUHdl = (FTPUser **)Get1NamedResource(FTPUSER, PrefRecordNamePtr);
HLock((Handle) FTPUHdl);
FTPUptr = *FTPUHdl;
SetCntrl(dptr, FTPUcanchangeCWD, FTPUptr->UserCanCWD);
SetTEText(dptr, FTPUusername, PrefRecordNamePtr);
for (scratchshort = 8, scratchPstring[0] = 8; scratchshort > 0; scratchshort--)
scratchPstring[scratchshort] = '•';
SetTEText(dptr, FTPUpassword, scratchPstring);
vRefNum = VolumeNameToRefNum(FTPUptr->DefaultDirVolName);
}
else {
IsNewPrefRecord = TRUE;
FTPUHdl = (FTPUser **)NewHandleClear(sizeof(FTPUser));
HLock((Handle) FTPUHdl);
FTPUptr = *FTPUHdl;
vRefNum = -1; // Default Volume
FTPUptr->DefaultDirDirID = 2; // Root directory
SetCntrl(dptr, FTPUcanchangeCWD, 0);
}
PathNameFromDirID(FTPUptr->DefaultDirDirID, vRefNum, scratchPstring);
SetTEText(dptr, FTPUDfltDirDsply, scratchPstring);
SelIText(dptr, FTPUusername, 0, 32767);
ShowWindow(dptr);
while (ditem > 2) {
ModalDialog(DLOGwOK_CancelUPP, &ditem);
switch (ditem) {
case FTPUcanchangeCWD:
FlipCheckBox(dptr, ditem);
break;
case FTPUDfltDirButton:
SelectDirectory(&vRefNum, &(FTPUptr->DefaultDirDirID));
PathNameFromDirID(FTPUptr->DefaultDirDirID, vRefNum, scratchPstring);
SetTEText(dptr, FTPUDfltDirDsply, scratchPstring);
break;
default:
break;
} // switch
} // while
if (ditem == 2) {
if (IsNewPrefRecord) DisposeHandle((Handle) FTPUHdl);
else ReleaseResource((Handle) FTPUHdl);
DisposeDialog(dptr);
return(FALSE); // No changes should be made.
}
FTPUptr->UserCanCWD = GetCntlVal(dptr, FTPUcanchangeCWD);
GetDirectoryName(vRefNum, 2, FTPUptr->DefaultDirVolName);
GetTEText(dptr, FTPUusername, PrefRecordNamePtr);
GetTEText(dptr, FTPUpassword, scratchPstring);
if (scratchPstring[0] != '•') {
// Encrypt the new (or possibly modified) password.
PtoCstr(scratchPstring);
Sencompass((char *)scratchPstring, (char *)scratchPstring2);
CtoPstr((char *)scratchPstring2);
BlockMove(scratchPstring2, FTPUptr->EncryptedPassword, Length(scratchPstring2)+1);
}
if (IsNewPrefRecord) {
UseResFile(TelInfo->SettingsFile);
resourceID = UniqueID(FTPUSER);
AddResource((Handle)FTPUHdl, FTPUSER, resourceID, PrefRecordNamePtr);
UpdateResFile(TelInfo->SettingsFile);
ReleaseResource((Handle)FTPUHdl);
}
else {
UseResFile(TelInfo->SettingsFile);
GetResInfo((Handle)FTPUHdl, &resourceID, &scratchResType,(StringPtr) &scratchPstring);
SetResInfo((Handle)FTPUHdl, resourceID, PrefRecordNamePtr);
ChangedResource((Handle)FTPUHdl);
UpdateResFile(TelInfo->SettingsFile);
ReleaseResource((Handle)FTPUHdl);
}
DisposeDialog(dptr);
return(TRUE); // A resource has changed or been added.
}